<?php

/**
 * @author GreyMag
 * @copyright 2009
 */

class Kontakt 
{
    public $db; // соединение с базой  
    public $_success = true, // все нормально =)
              $_answer = array(),    
              $_error = '', // сообщение об ошибке
              $_kontakt, // класс для запросов
              $_apiId, // id запущенного приложения
              $_userId, // id пользователя, со страницы которого было запущено приложение. Если приложение запущено не со страницы пользователя, то значение равно 0
              $_groupId, // id группы, со страницы которой было запущено приложение. Если приложение запущено не со страницы группы, то значение равно 0
              $_viewerId, // id пользователя, который просматривает приложение
              $_isAppUser, // если пользователь установил приложение – 1, иначе – 0
              $_viewerType, // это тип пользователя, который просматривает приложение
              $_authKey; // это ключ, необходимый для авторизации пользователя 
    
    function __construct( $apiId, $userId, $groupId, $viewerId, $isAppUser, $viewerType, $authKey )
    {
        // подключаемся к базе 
        //$this->db = new DBConnect();
        //$this->db->error;
            
        // принимаемые параметры
        $this->_apiId = (int)$apiId;
        $this->_userId = (int)$userId;
        $this->_groupId = (int)$groupId;
        $this->_viewerId = (int)$viewerId;
        $this->_isAppUser = (int)$isAppUser;
        $this->_viewerType = (int)$viewerType;
        $this->_authKey = (string)$authKey;
          
        // если не установлено или ключ не совпадает - нафик
        if( ( (int)$this->_isAppUser !== 1 ) || ( $this->_authKey !== $this->getAuthKey() ) )
        {
            $this->_success = false;
            $this->_error = 'Ошибка безопасности';
        } 
        
        $this->_kontakt = new SecureRequest( $this->_apiId ); // содаем класс для запросов    
    }
    
    // получаем код авторизации
    public function getAuthKey()
    {
        return md5( $this->_apiId . '_' . $this->_viewerId . '_' . SECURE_CODE );
    }
    
    // текущая дата в формате mysql
    public function mysqlDate( $unixtime = '' )
    {
        if( empty( $unixtime ) ) $unixtime = time() + TIMEADJUST;  
        return date( 'Y-m-d H:i:s', $unixtime );
    }
      
    // функция изменения формата даты из базы
    public function printMysqlDate( $mysqlDate, $printFormat = '' )
    {
        preg_match( "/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/", $mysqlDate, $date );
        
        $timestamp = mktime( (int)$date[4], (int)$date[5], (int)$date[6], (int)$date[2], (int)$date[3], (int)$date[1] );
        
        if( empty( $printFormat ) ) return $timestamp;
        else
        {
            setlocale( LC_ALL, 'ru_RU.UTF-8', 'rus_RUS.UTF-8', 'Russian_Russia.65001');
            return strftime( $printFormat, $timestamp );
        }       
    }
  
    // возвращаем ошибку
    public function error( $message = '' )
    {
        if( !empty( $message ) ) $this->_error = $message;
        else $this->_error = $this->db->error;
        $this->_success = false;
        
        return $this->answer();
    }
    
    /**
    * Kontakt::answer()
    * Функция для формирования ответа
    * @return array
    */
    public function answer()
    {
        $array = ( $this->_success ) ? $this->_answer : array( "error" => $this->_error ) ;
        $array["success"] = $this->_success;
        
        return $array;                            
    }
    
    /**
    * Kontakt::transferVotes()
    * Перевод голосов между пользователем и приложением
    * @param float $votes количество голосов, 
    * если отрицательное, то перевод идет с приложения к пользователю,
    * если положительное - наоборот
    * @param integer $userId - id пользователя, по умолчанию - текущий
    * @return boolean
    */
    public function transferVotes( $votes, $userId = 0 )
    {
        #|| $userId == '14921442'
        #if($userId == '49785088' || $userId == '14921442') return true ;
        #return $votes; 
        if( $votes == 0 ) return true;
        $userId = ( $userId == 0 ) ? $this->_viewerId : (int)$userId;
        
        if( $votes < 0 ) $op = SecureRequest::ADD_VOTES;
        else $op = SecureRequest::WITHDRAW_VOTES;
        
        $votes = (int)( abs( $votes ) * 100 );
            
        if( $result = $this->_kontakt->request( $op, array( 'uid' => $userId, 'votes' => $votes ) ) ) 
        {
            if( (int)$result->transferred == $votes ) return true;
            else {
              $this->_error = 'Недостаточно голосов на счету';
              
              // возвращаем ему эти жалкие копейки
              if( $op == SecureRequest::WITHDRAW_VOTES ) 
                    $this->transferVotes( - $result->transferred / 100, $userId );
              return false;
            }
        }
        else {
          $this->_error = ( $this->_kontakt->errno == 502 ) ? 'У Вас на счету нет голосов' : $this->_kontakt->errno . ': ' . $this->_kontakt->error;
          return false;
        } 
    }
    
    public function getAppBalance($user){
        if( !$result = $this->_kontakt->request(SecureRequest::GET_BALANCE, array('uid' => $user , 'format' => 'JSON' )) ){
            $this->_error = $this->_kontakt->error;
            return false;
        }
        return  $result->response/100;
        /*if( $result->response ){
            return $result->response/100 ;    
        }else{
            return 0;
        }*/
        
    }
    
    /**
    * RenderService::sendNotification()
    * Отправка уведомления пользователям
    * @param mixed $toUids id пользователя кому отправлять 
    * или массив id'ов пользователей
    * @param string $message текст сообщения
    * @return
    */
    protected function sendNotification( $toUids, $message )
    {
        //$this->_callMethod = __METHOD__;
        
        //$toUid = (int)$toUid;
        $toUids = ( is_array( $toUids ) ) ? $toUids : array( (int)$toUids );
         
		$message = trim( $message );
        $message = str_replace( '"', '', $message );
        $message = mysql_escape_string( $message );
        // $message = $this->db->escape_string( $message );
        
        $__arrayOfArrays = array_chunk( $toUids, 100 );
        
        foreach( $__arrayOfArrays as $__uidsArray )
        {
            $__uids = implode( ',', $__uidsArray );
            
            if( !$request = $this->_kontakt->request( SecureRequest::SEND_NOTIFICATION, array( 'uids' => $__uids, 'message' => $message ) ) )
            {
               $this->error( $this->_kontakt->error );
               return false;
            }                   
            sleep( SecureRequest::KONTAKT_REQUEST_DELAY ); // а то контакт ругаться будет
        }                                    
        return true;
    }
}
?>